#ifndef DEV_H
#define DEV_H

#ifndef WINDOWS
    #define WINDOWS
#endif

class MDev
{
private:
    void* outstream;
    void* instream;
public:
    /* 构造函数和析构函数 */
    MDev();
    ~MDev();

    /* 通用接口 */
    int  check_key();         // 键盘监听
    void set_terminal();      // 设置虚拟机终端
    void restore_terminal();  // 恢复物理机终端
    
    /* I/o接口 */
    virtual char inchar();
    virtual void outc(char);
    virtual void outs(const char* str);
    virtual void flush();
};

/**
 * @brief 
 *      为虚拟机实现一个虚拟的终端，该终端必须遵循 ANSI 标准
 *      关于 ANSI 请参考以下部分的代码
 *          https://www.cnblogs.com/qxhn/p/10984364.html
 *      该部分功能待实现
 */
class Terminal : public MDev
{
private:
private:
    void* outstream;
    void* instream;

    int cursor_x;        // 虚拟机光标横坐标
    int cursor_y;        // 虚拟机光标纵坐标
    int tws_row;         // 虚拟机终端窗口高度
    int tws_col;         // 虚拟机终端窗口宽度
    char** buffer;       // 虚拟机终端缓冲区，采用双缓冲区
public:
    Terminal();
    Terminal(int, int);
    ~Terminal();

    void createBuffer();
    void freeBuffer();

    /* I/o接口 */
    virtual char inchar();
    virtual void outc(char);
    virtual void outs(const char* str);
    virtual void flush();
};




#endif